package com.c2b.algorithm.leetcode.base;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href='https://leetcode.cn/problems/count-common-words-with-one-occurrence/'>统计出现过一次的公共字符串(Count Common Words With One Occurrence)</a>
 * <p>给你两个字符串数组 words1 和 words2 ，请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：words1 = ["leetcode","is","amazing","as","is"], words2 = ["amazing","leetcode","is"]
 *      输出：2
 *      解释：
 *          - "leetcode" 在两个数组中都恰好出现一次，计入答案。
 *          - "amazing" 在两个数组中都恰好出现一次，计入答案。
 *          - "is" 在两个数组中都出现过，但在 words1 中出现了 2 次，不计入答案。
 *          - "as" 在 words1 中出现了一次，但是在 words2 中没有出现过，不计入答案。
 *          所以，有 2 个字符串在两个数组中都恰好出现了一次。
 *
 * 示例 2：
 *      输入：words1 = ["b","bb","bbb"], words2 = ["a","aa","aaa"]
 *      输出：0
 *      解释：没有字符串在两个数组中都恰好出现一次。
 *
 * 示例 3：
 *      输入：words1 = ["a","ab"], words2 = ["a","a","a","ab"]
 *      输出：1
 *      解释：唯一在两个数组中都出现一次的字符串是 "ab" 。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= words1.length, words2.length <= 1000</li>
 *     <li>1 <= words1[i].length, words2[j].length <= 30</li>
 *     <li>words1[i] 和 words2[j] 都只包含小写英文字母。</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/12 10:20
 */
public class LC2085CountCommonWordsWithOneOccurrence_S {
    static class Solution {
        public int countWords(String[] words1, String[] words2) {
            Map<String, Integer> cnt1Map = new HashMap<>();
            Map<String, Integer> cnt2Map = new HashMap<>();
            for (String curStr : words1) {
                cnt1Map.put(curStr, cnt1Map.getOrDefault(curStr, 0) + 1);
            }
            for (String curStr : words2) {
                cnt2Map.put(curStr, cnt2Map.getOrDefault(curStr, 0) + 1);
            }
            int ret = 0;
            for (Map.Entry<String, Integer> entry : cnt1Map.entrySet()) {
                if (entry.getValue() == 1 && cnt2Map.containsKey(entry.getKey()) && cnt2Map.get(entry.getKey()) == 1) {
                    ++ret;
                }
            }
            return ret;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.countWords(
                new String[]{"leetcode", "is", "amazing", "as", "is"},
                new String[]{"amazing", "leetcode", "is"}
        ));

        System.out.println(solution.countWords(
                new String[]{"b", "bb", "bbb"},
                new String[]{"a", "aa", "aaa"}
        ));

        System.out.println(solution.countWords(
                new String[]{"a", "ab"},
                new String[]{"a", "a", "a", "ab"}
        ));
    }


}
